#ifndef __G_INPUT_DEFINITIONS_H__
#define __G_INPUT_DEFINITIONS_H__

namespace GEngine
{
	enum GKeyboardSemantics
	{
		G_KS_Escape			= 0x00,
		G_KS_1				= 0x01,
		G_KS_2				= 0x02,
		G_KS_3				= 0x03,
		G_KS_4				= 0x04,
		G_KS_5				= 0x05,
		G_KS_6				= 0x06,
		G_KS_7				= 0x07,
		G_KS_8				= 0x08,
		G_KS_9				= 0x09,
		G_KS_0				= 0x0A,
		G_KS_Minus			= 0x0B,		// - on main keyboard
		G_KS_Equals			= 0x0C,
		G_KS_BackSpace		= 0x0D,		// backspace
		G_KS_Tab			= 0x0E,
		G_KS_Q				= 0x0F,
		G_KS_W				= 0x10,
		G_KS_E				= 0x11,
		G_KS_R				= 0x12,
		G_KS_T				= 0x13,
		G_KS_Y				= 0x14,
		G_KS_U				= 0x15,
		G_KS_I				= 0x16,
		G_KS_O				= 0x17,
		G_KS_P				= 0x18,
		G_KS_LeftBracket	= 0x19,
		G_KS_RightBracket	= 0x1A,
		G_KS_Enter			= 0x1B,		// Enter on main keyboard
		G_KS_LeftCtrl		= 0x1C,
		G_KS_A				= 0x1D,
		G_KS_S				= 0x1E,
		G_KS_D				= 0x1F,
		G_KS_F				= 0x20,
		G_KS_G				= 0x21,
		G_KS_H				= 0x22,
		G_KS_J				= 0x23,
		G_KS_K				= 0x24,
		G_KS_L				= 0x25,
		G_KS_Semicolon		= 0x26,
		G_KS_Apostrophe		= 0x27,
		G_KS_Grave			= 0x28,		// accent grave
		G_KS_LeftShift		= 0x29,
		G_KS_BackSlash		= 0x2A,
		G_KS_Z				= 0x2B,
		G_KS_X				= 0x2C,
		G_KS_C				= 0x2D,
		G_KS_V				= 0x2E,
		G_KS_B				= 0x2F,
		G_KS_N				= 0x30,
		G_KS_M				= 0x31,
		G_KS_Comma			= 0x32,
		G_KS_Period			= 0x33,		// . on main keyboard
		G_KS_Slash			= 0x34,		// / on main keyboard
		G_KS_RightShift		= 0x35,
		G_KS_NumPadStar		= 0x36,		// * on numeric keypad
		G_KS_LeftAlt		= 0x37,
		G_KS_Space			= 0x38,
		G_KS_CapsLock		= 0x39,
		G_KS_F1				= 0x3A,
		G_KS_F2				= 0x3B,
		G_KS_F3				= 0x3C,
		G_KS_F4				= 0x3D,
		G_KS_F5				= 0x3E,
		G_KS_F6				= 0x3F,
		G_KS_F7				= 0x40,
		G_KS_F8				= 0x41,
		G_KS_F9				= 0x42,
		G_KS_F10			= 0x43,
		G_KS_NumLock		= 0x44,
		G_KS_ScrollLock		= 0x45,
		G_KS_NumPad7		= 0x46,
		G_KS_NumPad8		= 0x47,
		G_KS_NumPad9		= 0x48,
		G_KS_NumPadMinus	= 0x49,		// - on numeric keypad
		G_KS_NumPad4		= 0x4A,
		G_KS_NumPad5		= 0x4B,
		G_KS_NumPad6		= 0x4C,
		G_KS_NumPadPlus		= 0x4D,		// + on numeric keypad
		G_KS_NumPad1		= 0x4E,
		G_KS_NumPad2		= 0x4F,
		G_KS_NumPad3		= 0x50,
		G_KS_NumPad0		= 0x51,
		G_KS_NumPadPeriod	= 0x52,		// . on numeric keypad
		G_KS_SmallerGreater	= 0x53,		// <> or \| on RT 102-key keyboard (Non-U.S.)
		G_KS_F11			= 0x54,
		G_KS_F12			= 0x55,
		G_KS_F13			= 0x56,		//                     (NEC PC98)
		G_KS_F14			= 0x57,		//                     (NEC PC98)
		G_KS_F15			= 0x58,		//                     (NEC PC98)
		G_KS_NumPadEquals	= 0x59,		// = on numeric keypad (NEC PC98)
		G_KS_AT				= 0x5A,		//                     (NEC PC98)
		G_KS_Colon			= 0x5B,		//                     (NEC PC98)
		G_KS_Underline		= 0x5C,		//                     (NEC PC98)
		G_KS_Stop			= 0x5D,		//                     (NEC PC98)
		G_KS_Unlabeled		= 0x5E,		//                        (J3100)
		G_KS_NumPadEnter	= 0x5F,		// Enter on numeric keypad
		G_KS_RightCtrl		= 0x60,
		G_KS_NumPadComma	= 0x61,		// , on numeric keypad (NEC PC98)
		G_KS_NumPadSlash	= 0x62,		// / on numeric keypad
		G_KS_SysRQ			= 0x63,
		G_KS_RightAlt		= 0x64,		// right Alt
		G_KS_Pause			= 0x65,		// Pause
		G_KS_Home			= 0x66,		// Home on arrow keypad
		G_KS_UpArrow		= 0x67,		// UpArrow on arrow keypad
		G_KS_PageUp			= 0x68,		// PgUp on arrow keypad
		G_KS_LeftArrow		= 0x69,		// LeftArrow on arrow keypad
		G_KS_RightArrow		= 0x6A,		// RightArrow on arrow keypad
		G_KS_End			= 0x6B,		// End on arrow keypad
		G_KS_DownArrow		= 0x6C,		// DownArrow on arrow keypad
		G_KS_PageDown		= 0x6D,		// PgDn on arrow keypad
		G_KS_Insert			= 0x6E,		// Insert on arrow keypad
		G_KS_Delete			= 0x6F,		// Delete on arrow keypad

		G_KS_PrintScreen	= 0x70,
		G_KS_Sleep			= 0x71,

		G_KS_Mute			= 0x72,
		G_KS_VolumeUp		= 0x73,
		G_KS_VolumeDown		= 0x74,

		G_KS_COUNT			= 0x75,
	};

	static const char* GKeyboardSemanticNames[G_KS_COUNT] = 
	{
		"Keyboard_Escape",
		"Keyboard_1",
		"Keyboard_2",
		"Keyboard_3",
		"Keyboard_4",
		"Keyboard_5",
		"Keyboard_6",
		"Keyboard_7",
		"Keyboard_8",
		"Keyboard_9",
		"Keyboard_0",
		"Keyboard_Minus",
		"Keyboard_Equals",
		"Keyboard_BackSpace",
		"Keyboard_Tab",
		"Keyboard_Q",
		"Keyboard_W",
		"Keyboard_E",
		"Keyboard_R",
		"Keyboard_T",
		"Keyboard_Y",
		"Keyboard_U",
		"Keyboard_I",
		"Keyboard_O",
		"Keyboard_P",
		"Keyboard_LeftBracket",
		"Keyboard_RightBracket",
		"Keyboard_Enter",
		"Keyboard_LeftCtrl",
		"Keyboard_A",
		"Keyboard_S",
		"Keyboard_D",
		"Keyboard_F",
		"Keyboard_G",
		"Keyboard_H",
		"Keyboard_J",
		"Keyboard_K",
		"Keyboard_L",
		"Keyboard_Semicolon",
		"Keyboard_Apostrophe",
		"Keyboard_Grave",
		"Keyboard_LeftShift",
		"Keyboard_BackSlash",
		"Keyboard_Z",
		"Keyboard_X",
		"Keyboard_C",
		"Keyboard_V",
		"Keyboard_B",
		"Keyboard_N",
		"Keyboard_M",
		"Keyboard_Comma",
		"Keyboard_Period",
		"Keyboard_Slash",
		"Keyboard_RightShift",
		"Keyboard_NumPadStar",
		"Keyboard_LeftAlt",
		"Keyboard_Space",
		"Keyboard_CapsLock",
		"Keyboard_F1",
		"Keyboard_F2",
		"Keyboard_F3",
		"Keyboard_F4",
		"Keyboard_F5",
		"Keyboard_F6",
		"Keyboard_F7",
		"Keyboard_F8",
		"Keyboard_F9",
		"Keyboard_F10",
		"Keyboard_NumLock",
		"Keyboard_ScrollLock",
		"Keyboard_NumPad7",
		"Keyboard_NumPad8",
		"Keyboard_NumPad9",
		"Keyboard_NumPadMinus",
		"Keyboard_NumPad4",
		"Keyboard_NumPad5",
		"Keyboard_NumPad6",
		"Keyboard_NumPadPlus",
		"Keyboard_NumPad1",
		"Keyboard_NumPad2",
		"Keyboard_NumPad3",
		"Keyboard_NumPad0",
		"Keyboard_NumPadPeriod",
		"Keyboard_SmallerGreater",
		"Keyboard_F11",
		"Keyboard_F12",
		"Keyboard_F13",
		"Keyboard_F14",
		"Keyboard_F15",
		"Keyboard_NumPadEquals",
		"Keyboard_AT",
		"Keyboard_Colon",
		"Keyboard_Underline",
		"Keyboard_Stop",
		"Keyboard_Unlabeled",
		"Keyboard_NumPadEnter",
		"Keyboard_RightCtrl",
		"Keyboard_NumPadComma",
		"Keyboard_NumPadSlash",
		"Keyboard_SysRQ",
		"Keyboard_RightAlt",
		"Keyboard_Pause",
		"Keyboard_Home",
		"Keyboard_UpArrow",
		"Keyboard_PageUp",
		"Keyboard_LeftArrow",
		"Keyboard_RightArrow",
		"Keyboard_End",
		"Keyboard_DownArrow",
		"Keyboard_PageDown",
		"Keyboard_Insert",
		"Keyboard_Delete",
		"Keyboard_PrintScreen",
		"Keyboard_Sleep",
		"Keyboard_Mute",
		"Keyboard_VolumeUp",
		"Keyboard_VolumeDown",
	};


	enum GMouseSemantics
	{
		G_MS_PosX			= 0x00,
		G_MS_PosY			= 0x01,
		G_MS_PosZ			= 0x02,
		G_MS_Button0		= 0x03,
		G_MS_Button1		= 0x04,
		G_MS_Button2		= 0x05,
		G_MS_Button3		= 0x06,
		G_MS_Button4		= 0x07,
		G_MS_Button5		= 0x08,
		G_MS_Button6		= 0x09,
		G_MS_Button7		= 0x0A,
		G_MS_Button8		= 0x0B,
		G_MS_Button9		= 0x0C,
		G_MS_Button10		= 0x0D,
		G_MS_Button11		= 0x0E,
		G_MS_Button12		= 0x0F,
		G_MS_Button13		= 0x10,
		G_MS_Button14		= 0x11,
		G_MS_Button15		= 0x12,
		
		G_MS_COUNT			= 0x13,

		// Synonyms
		G_MS_Button_Left	= G_MS_Button0,
		G_MS_Button_Middle	= G_MS_Button1,
		G_MS_Button_Right	= G_MS_Button2,
	};

	static const char* GMouseSemanticNames[G_MS_COUNT] = 
	{
		"Mouse_PosX",
		"Mouse_PosY",
		"Mouse_PosZ",
		"Mouse_Button0",
		"Mouse_Button1",
		"Mouse_Button2",
		"Mouse_Button3",
		"Mouse_Button4",
		"Mouse_Button5",
		"Mouse_Button6",
		"Mouse_Button7",
		"Mouse_Button8",
		"Mouse_Button9",
		"Mouse_Button10",
		"Mouse_Button11",
		"Mouse_Button12",
		"Mouse_Button13",
		"Mouse_Button14",
		"Mouse_Button15",
	};

	enum GJoyStickSemantics
	{
		G_JS_PosX			= 0x00,
		G_JS_PosY			= 0x01,
		G_JS_PosZ			= 0x02,
		G_JS_RotX			= 0x03,
		G_JS_RotY			= 0x04,
		G_JS_RotZ			= 0x05,
		G_JS_Slider0		= 0x06,
		G_JS_Slider1		= 0x07,
		G_JS_Button0		= 0x08,
		G_JS_Button1		= 0x09,
		G_JS_Button2		= 0x0A,
		G_JS_Button3		= 0x0B,
		G_JS_Button4		= 0x0C,
		G_JS_Button5		= 0x0D,
		G_JS_Button6		= 0x0E,
		G_JS_Button7		= 0x0F,
		G_JS_Button8		= 0x10,
		G_JS_Button9		= 0x11,
		G_JS_Button10		= 0x12,
		G_JS_Button11		= 0x13,
		G_JS_Button12		= 0x14,
		G_JS_Button13		= 0x15,
		G_JS_Button14		= 0x16,
		G_JS_Button15		= 0x17,

		G_JS_COUNT			= 0x18,
	};

	static const char* GJoyStickSemanticNames[G_JS_COUNT] = 
	{
		"Joystick_XPos",
		"Joystick_YPos",
		"Joystick_ZPos",
		"Joystick_XRot",
		"Joystick_YRot",
		"Joystick_ZRot",
		"Joystick_Slider0",
		"Joystick_Slider1",
		"Joystick_Button0",
		"Joystick_Button1",
		"Joystick_Button2",
		"Joystick_Button3",
		"Joystick_Button4",
		"Joystick_Button5",
		"Joystick_Button6",
		"Joystick_Button7",
		"Joystick_Button8",
		"Joystick_Button9",
		"Joystick_Button10",
		"Joystick_Button11",
		"Joystick_Button12",
		"Joystick_Button13",
		"Joystick_Button14",
		"Joystick_Button15",
	};

	enum GTouchSemantics
	{
		G_TS_Pan			= 0x00,
		G_TS_Tap			= 0x01,
		G_TS_Press			= 0x02,
		G_TS_PressAndTap	= 0x03,
		G_TS_Zoom			= 0x04,
		G_TS_Rotate			= 0x05,
		G_TS_Flick			= 0x06,
		G_TS_Wheel			= 0x07,
		G_TS_Touch0			= 0x08,
		G_TS_Touch1			= 0x09,
		G_TS_Touch2			= 0x0A,
		G_TS_Touch3			= 0x0B,
		G_TS_Touch4			= 0x0C,
		G_TS_Touch5			= 0x0D,
		G_TS_Touch6			= 0x0E,
		G_TS_Touch7			= 0x0F,
		G_TS_Touch8			= 0x10,
		G_TS_Touch9			= 0x11,
		G_TS_Touch10		= 0x12,
		G_TS_Touch11		= 0x13,
		G_TS_Touch12		= 0x14,
		G_TS_Touch13		= 0x15,
		G_TS_Touch14		= 0x16,
		G_TS_Touch15		= 0x17,

		G_TS_COUNT			= 0x18,
	};

	static const char* GTouchSemanticNames[G_TS_COUNT] = 
	{
		"Touch_Pan",
		"Touch_Tap",
		"Touch_Press",
		"Touch_PressAndTap",
		"Touch_Zoom",
		"Touch_Rotate",
		"Touch_Flick",
		"Touch_Wheel",
		"Touch_Touch0",
		"Touch_Touch1",
		"Touch_Touch2",
		"Touch_Touch3",
		"Touch_Touch4",
		"Touch_Touch5",
		"Touch_Touch6",
		"Touch_Touch7",
		"Touch_Touch8",
		"Touch_Touch9",
		"Touch_Touch10",
		"Touch_Touch11",
		"Touch_Touch12",
		"Touch_Touch13",
		"Touch_Touch14",
		"Touch_Touch15",
	};

	enum GGamepadSemantics
	{
		G_GS_RThumbX		= 0x00,
		G_GS_RThumbY		= 0x01,
		G_GS_LThumbX		= 0x02,
		G_GS_LThumbY		= 0x03,
		G_GS_ButtonX		= 0x04,
		G_GS_ButtonY		= 0x05,
		G_GS_ButtonA		= 0x06,
		G_GS_ButtonB		= 0x07,
		G_GS_ButtonRT		= 0x08,	// Right Top
		G_GS_ButtonRB		= 0x09,	// Right Bottom
		G_GS_ButtonRS		= 0x0A,	// Right Stick
		G_GS_ButtonLT		= 0x0B,	// Left Top
		G_GS_ButtonLB		= 0x0C,	// Left Bottom
		G_GS_ButtonLS		= 0x0D,	// Left Stick
		G_GS_ButtonStart	= 0x0E,
		G_GS_ButtonSelect	= 0x0F,

		G_GS_COUNT			= 0x10,

		// Synonyms
		G_GS_ButtonSquare	= G_GS_ButtonX,
		G_GS_ButtonTriangle	= G_GS_ButtonY,
		G_GS_ButtonCross	= G_GS_ButtonA,
		G_GS_ButtonCircle	= G_GS_ButtonB,
	};	

	static const char* GGamepadSemanticNames[G_GS_COUNT] = 
	{
		"Gamepad_RThumbX	",
		"Gamepad_RThumbY	",
		"Gamepad_LThumbX	",
		"Gamepad_LThumbY	",
		"Gamepad_ButtonX	",
		"Gamepad_ButtonY	",
		"Gamepad_ButtonA	",
		"Gamepad_ButtonB	",
		"Gamepad_ButtonRT	",
		"Gamepad_ButtonRB	",
		"Gamepad_ButtonRS	",
		"Gamepad_ButtonLT	",
		"Gamepad_ButtonLB	",
		"Gamepad_ButtonLS	",
		"Gamepad_ButtonStart",
		"Gamepad_ButtonSelect",
	};

}

#endif